//第四天错题

//1.
#include <stdio.h>
int main()
{
	int n = 0;//计数器
	char ch = '0';

	//getchar的返回值是将字符强制转化为正数的结果即该字符的阿斯克码值
	//但是对于for循环而言，只进行一次初始化，后面只进行条件判断语句和循环体
	//故此程序会陷入死循环，达不到统计字符个数的效果
	for (ch = getchar(); ch != '\0'; n++)
	{
		;
	}

	printf("%d\n", n);
}


//2.
#include <stdio.h>
int main()
{
	char c;
	int v0 = 0, v1 = 0, v2 = 0;

		do
		{
			switch (c = getchar())
			{
			case'a':case'A':
			case'e':case'E':
			case'i':case'I':
			case'o':case'O':
			case'u':case'U':v1 += 1;
			default:v0 += 1; v2 += 1;
			}
		} while (c != '\n');//end of do while;

		printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2);
		return 0;
}
//以上代码可转化为：
#include <stdio.h>
int main()
{
	char c;
	int v0 = 0, v1 = 0, v2 = 0;

	//对于do while 循环语句来说，先进行循环体，后进行条件判断，所以当该循环输入空格后，循环体仍会执行一次，后条件不满足跳出循环
	do
	{
		//该switch语句中没有break来跳出循环，所以程序会从入口处一直执行到循环结尾
		//例如，输入'A'，会执行v1 += 1；v0+= 1；v2 += 1;
		//输入'p',只会执行 v0+= 1；v2 += 1;
		
		switch (c = getchar())
		{
		case'a':
		case'A':
		case'e':
		case'E':
		case'i':
		case'I':
		case'o':
		case'O':
		case'u':
		case'U':
			v1 += 1;
		default:
			v0 += 1; 
			v2 += 1;
		}
	} while (c != '\n');//end of do while;

	printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2);
	return 0;
}

//3.判断该循环执行多少次
int main()
{
	int n = 0;
	int i = 0;

	//当i = 0时，内循环执行n次，当i = 1时，内循环执行n-1次，以此类推，n-2，n-3，..... 3,2,1
	//总次数等于n+n-1+n-2+....+3+2+1，其实就是等差数列
	//故总次数为：n（n+1）/2；
	for (i = 0; i <= n - 1; i++) // (1)
	{
		int j = 0;

		for (j = n; j > i; j--) // (2)
		{
			//state;(3)
		}
	}
}

//4.错误的集合
#include <stdio.h>
#include <stdlib.h>

int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
	//创建一个动态内存，用来存放返回的数
	int* ret = (int*)malloc(sizeof(int) * 2);
	*returnSize = 2;

	//创建hash数组，用以下标的方式存放nums中的数并初始化为0
	int hash[100000] = { 0 };
	int i = 0;
	for (i = 0; i < numsSize; i++)
	{
		hash[i] = 0;
	}

	//将nums中的数作为hash中的下标储存起来并将nums中存在的数为下标的hash+1
	//如果重复的数，则+2
	for (i = 0; i < numsSize; i++)
	{
		hash[nums[i]] += 1;
	}

	for (i = 1; i < numsSize + 1; i++)
	{
		//重复数字会导致hash中下标重复的值为2
		if (2 == hash[i])
		{
			ret[0] = i;
		}

		//nums中没出现的数，就是hash中为0元素的下标
		if (0 == hash[i])
		{
			ret[1] = i;
		}
	}

	return ret;
}
int main()
{
	int nums[] = {1,2,2,4};
	int numsSize = sizeof(nums) / sizeof(nums[0]);
	int returnSize = 0;
	int* returnarr = findErrorNums(nums, numsSize, &returnSize);
	int i = 0;
	for (i = 0; i < returnSize; i++)
	{
		printf("%d ", returnarr[i]);
	}
	return 0;
}